home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / xlib / pcx2csrc / pcx2csrc.cpp < prev    next >
C/C++ Source or Header  |  1994-07-09  |  6KB  |  229 lines

  1. // PCX2CSRC.CPP
  2. // Converts bitmap and palette data from a PCX file into C++ source code
  3. // coded by Tumblin / Bodies In Motion
  4.  
  5.  
  6. #include  <process.h>
  7. #include    <stdio.h>
  8. #include    <stdlib.h>
  9. #include    <conio.h>
  10. #include    <dos.h>
  11. #include    "pcx.h"
  12.  
  13.  
  14. FILE *fp;
  15. char source_filename[80];
  16. char target_filename[80];
  17.  
  18. pcx_struct pcxbuf;  // Buffer for PCX data
  19. Pcx pcxloader;      // PCX loader object
  20. int width, height;    // width and height in pixels
  21. int top_left_x,top_left_y,bottom_right_x,bottom_right_y;
  22. char which_mode;    // X = Mode-X bitmap, L = linear mode 13h bitmap
  23.  
  24.  
  25. void WriteBitmapXData(void);    // Mode-X
  26. void WriteBitmapLData(void);    // Mode 13h
  27. void WritePaletteData(void);
  28.  
  29.  
  30. void main()
  31. {
  32.     // greet the user and ask for information
  33.     printf("                    ┌──────────────────────────────────┐\n");
  34.     printf("                    │ PCX to C++ Source Code Converter │\n");
  35.     printf("                    │ for use with PCX files and XLIB  │\n");
  36.     printf("                    │  by Tumblin / Bodies In Motion   │\n");
  37.     printf("                    └──────────────────────────────────┘\n\n\n");
  38.  
  39.     printf("Enter the filename of the source PCX file\n");
  40.     printf("(filename.ext) : ");
  41.     scanf("%s",&source_filename);
  42.  
  43.     printf("\nEnter the filename of the target source code file\n");
  44.     printf("(filename.ext) : ");
  45.     scanf("%s",&target_filename);
  46.  
  47.     printf("\nDo you want to do a Mode-X planar bitmap or Linear bitmap?\n");
  48.     printf("[X/L] : ");
  49.     which_mode=getche();
  50.     if(which_mode=='x' || which_mode=='X')
  51.     {
  52.         which_mode='X';
  53.         printf("\n\nNote you must make sure that the width of your bitmap is\n");
  54.         printf("divisible by four.\n\n");
  55.     }
  56.  
  57.     if(which_mode=='y' || which_mode=='Y')
  58.         which_mode='Y';
  59.  
  60.     printf("\n\nEnter top left X coordinate of bitmap : ");
  61.     scanf("%i",&top_left_x);
  62.  
  63.     printf("\nEnter top left Y coordinate of bitmap : ");
  64.     scanf("%i",&top_left_y);
  65.  
  66.     printf("\nEnter bottom right X coordinate of bitmap : ");
  67.     scanf("%i",&bottom_right_x);
  68.  
  69.     printf("\nEnter bottom right Y coordinate of bitmap : ");
  70.     scanf("%i",&bottom_right_y);
  71.  
  72.  
  73.     if (pcxloader.load(source_filename,&pcxbuf))
  74.     {
  75.         puts("Sorry but couldn't load PCX file.\n");     // Can't open it?
  76.         exit(0);                             // Abort w/error
  77.     }
  78.  
  79.     // open target source code file
  80.     fp=fopen(target_filename,"w");
  81.     if(!fp)
  82.     {
  83.         printf("\nSorry but I couldn't open the target file.");
  84.         exit(1);
  85.     }
  86.  
  87.  
  88.     // Generate appropriate bitmap data
  89.     if(which_mode=='X')
  90.         WriteBitmapXData();
  91.     else
  92.         WriteBitmapLData();
  93.  
  94.     // Generate appropriate palette data
  95.     WritePaletteData();
  96.  
  97.  
  98.     // all done, exit
  99.     fclose(fp);
  100. }
  101.  
  102.  
  103. void WriteBitmapXData(void)
  104. {
  105.     int p;
  106.     int height=bottom_right_y-top_left_y+1;
  107.     int width=bottom_right_x-top_left_x+1;
  108.  
  109.     fprintf(fp,"// This is a Mode-X Planar Bitmap\n");
  110.     fprintf(fp,"char name_of_bitmap[] =\n{\n");
  111.     fprintf(fp,"  %3i,  // width in bytes (4 pixel groups)\n",width/4);
  112.     fprintf(fp,"  %3i,  // height in pixels\n\n  ",height);
  113.  
  114.     // write data for planes 0 to 2
  115.     for(p=0; p<3; p++)
  116.     {
  117.         fprintf(fp,"// plane %d\n  ",p);
  118.         for(int y=top_left_y; y <= bottom_right_y; y++)
  119.         {
  120.             for(int x=top_left_x+p; x <= bottom_right_x; x+=4)
  121.             {
  122.                 if((int)pcxbuf.image[y*320+x] < 0)
  123.                     fprintf(fp,"%3i,",(int)pcxbuf.image[y*320+x]+256);
  124.                 else
  125.                     fprintf(fp,"%3i,",(unsigned int)pcxbuf.image[y*320+x]);
  126.             }
  127.             fprintf(fp,"\n  ");
  128.         }
  129.     }
  130.     fprintf(fp,"// plane %d\n  ",p);
  131.  
  132.     // write data for plane 3 but don't do the last line
  133.     for(int y=top_left_y; y < bottom_right_y; y++)
  134.     {
  135.         for(int x=top_left_x+p; x <= bottom_right_x; x+=4)
  136.             if((int)pcxbuf.image[y*320+x] < 0)
  137.                 fprintf(fp,"%3i,",(int)pcxbuf.image[y*320+x]+256);
  138.             else
  139.             fprintf(fp,"%3i,",(unsigned int)pcxbuf.image[y*320+x]);
  140.     fprintf(fp,"\n  ");
  141.     }
  142.  
  143.     // write data for last line of plane 3 but not the last pixel
  144.     for(int x=top_left_x+p; x < bottom_right_x; x+=4)
  145.     {
  146.         if((int)pcxbuf.image[height*320+x] < 0)
  147.             fprintf(fp,"%3i,",(int)pcxbuf.image[bottom_right_y*320+x]+256);
  148.         else
  149.             fprintf(fp,"%3i,",(unsigned int)pcxbuf.image[bottom_right_y*320+x]);
  150.     }
  151.  
  152.     // write the data for the last pixel of the last line of plane 3
  153.     if((int)pcxbuf.image[bottom_right_y*320+bottom_right_x] < 0)
  154.         fprintf(fp,"%3i",(int)pcxbuf.image[bottom_right_y*320+bottom_right_x]+256);
  155.     else
  156.         fprintf(fp,"%3i",(unsigned int)pcxbuf.image[bottom_right_y*320+bottom_right_x]);
  157.  
  158.     // write the final "};"
  159.     fprintf(fp,"\n};\n\n\n");
  160. }
  161.  
  162.  
  163. void WriteBitmapLData(void)
  164. {
  165.     int x,y;
  166.  
  167.     width=bottom_right_x-top_left_x+1;
  168.     height=bottom_right_y-top_left_y+1;
  169.  
  170.     fprintf(fp,"// This is a linear Mode 13h Bitmap\n");
  171.     fprintf(fp,"char name_of_bitmap[] =\n{\n");
  172.     fprintf(fp,"  %3i,    // width in pixels\n",width);
  173.     fprintf(fp,"  %3i,    // height in pixels\n",height);
  174.  
  175.  
  176.     // write data for bitmap but not last line
  177.     for(y=top_left_y; y<bottom_right_y; y++)
  178.     {
  179.         fprintf(fp,"\n  ");
  180.         for(x=top_left_x; x<=bottom_right_x; x++)
  181.         {
  182.             if((int)pcxbuf.image[y*320+x] < 0)
  183.                 fprintf(fp,"%3i,",(int)pcxbuf.image[y*320+x]+256);
  184.             else
  185.                 fprintf(fp,"%3i,",(unsigned int)pcxbuf.image[y*320+x]);
  186.         }
  187.     }
  188.  
  189.     fprintf(fp,"\n  ");
  190.  
  191.     // write data for last line of bitmap but not last pixel
  192.     for(x=top_left_x; x<bottom_right_x; x++)
  193.     {
  194.         if((int)pcxbuf.image[bottom_right_y*320+x] < 0)
  195.             fprintf(fp,"%3i,",(int)pcxbuf.image[bottom_right_y*320+x]+256);
  196.         else
  197.             fprintf(fp,"%3i,",(unsigned int)pcxbuf.image[bottom_right_y*320+x]);
  198.     }
  199.  
  200.     // write data for last pixel of last line
  201.     if((int)pcxbuf.image[bottom_right_y*320+bottom_right_x] < 0)
  202.         fprintf(fp,"%3i",(int)pcxbuf.image[bottom_right_y*320+bottom_right_x]+256);
  203.     else
  204.         fprintf(fp,"%3i",(unsigned int)pcxbuf.image[bottom_right_y*320+bottom_right_x]);
  205.  
  206.     // write the final "};"
  207.     fprintf(fp,"\n};\n\n\n");
  208. }
  209.  
  210.  
  211. void WritePaletteData(void)
  212. {
  213.     // write the source code for the palette data
  214.     fprintf(fp,"// This is palette data\n");
  215.     fprintf(fp,"char name_of_palette[3*256]=\n{");
  216.  
  217.     // write data for all colors in palette but not last one
  218.     for(int y=0; y<255; y++)
  219.     {
  220.         fprintf(fp,"\n  %2i,%2i,%2i, // color # %i",pcxbuf.palette[y*3],pcxbuf.palette[y*3+1],pcxbuf.palette[y*3+2],y);
  221.     }
  222.  
  223.     // write data for last color in palette
  224.     fprintf(fp,"\n  %2i,%2i,%2i  // color # 255",pcxbuf.palette[y*3],pcxbuf.palette[y*3+1],pcxbuf.palette[y*3+2]);
  225.  
  226.     // write the final "};"
  227.     fprintf(fp,"\n};");
  228. }
  229.